package com.tkm.types.nullables

import com.tkm.java.APerson
import java.io.File

fun main() {
    //  Kotlin的不可空类型，不能赋值为null
//    var string: String = "Hello"
//    string = "World"
//    string = null

    var string: String? = "Hello"
    string = "World"
    string = null
    val length = string?.length
    println(length ?: 0)

    //  强转不为空的类型
    //  如果为空，则报错java.lang.NullPointerException
//    val lengthNotNull = string!!.length
//    println(lengthNotNull)

    //  可以认为String是String?的子类（里氏替换原则）
    var x: String = ""
    var y: String? = null
    y = x

    //  Int为Number的子类
    var a: Int = 2
    var b: Number = 0.0
    b = a

    //  如果不使用@Nullable注解，则title为String!类型，即平台类型
    //  Kotlin编译器无法推断出平台类型是否为空
    val p = APerson("TKM")
    p.title = null
    val title = p.title
    println(title?.length ?: 0)

    //  在使用平台类型时，需要手动判定是否为null
    val f = File("abc")
    val files = f.listFiles()
    //  Kotlin编译器无法确定files是否为null
    println(files?.size ?: 0)
}
